package com.test;

import java.util.Vector;

public class EnemyTank extends Tank implements Runnable
{
	Thread t;
	private int sp;
	//on a besoin d'une variable pour connaitre quels sont les chars
	Vector<Tank> ets = new Vector<Tank>();
	Hero hero = null;
	//
	
	public Hero getHero() {
		return hero;
	}

	public void setHero(Hero hero) {
		this.hero = hero;
	}

	public EnemyTank(int x,int y)
	{
		super(x,y);
		this.setDirect(1);
		this.setColor(0);
	}
	public EnemyTank(int x,int y,int direct)
	{
		super(x,y,direct);
		this.setDirect(1);
		this.setColor(0);
	}
	
	//capturer tous les chars de MyPanel
	public void setEts(Vector<Tank> vector)
	{
		
		this.ets = vector;
		ets.add(this.hero);
	}
	
	public void tirer()
	{
		
		
		switch(this.getDirect())
		{
		case 0:
			m = new Munition(this.getX()-1,this.getY()-14,0);
			mm.add(m);
			break;
		case 1:
			m = new Munition(this.getX()-1,this.getY()+11,1);
			mm.add(m);
			break;
		case 2:
			m = new Munition(this.getX()-14,this.getY()-1,2);
			mm.add(m);
			break;
		case 3:
			m = new Munition(this.getX()+11,this.getY()-1,3);
			mm.add(m);
			break;
		}
		
		t=new Thread(m);
		t.start();
		
	}
	
	
	

	@Override
	public void run() {
		// TODO Auto-generated method stub
		int times = 0;
		setSp(20);
		if((int)Math.random()+1 == 1 )
		{
		this.setDirect((int) (Math.random()*4));
		}
		while(this.isAlive())
		{
			try{
				Thread.sleep((long) (Math.random()*30+50));
			}
			catch(Exception e){
				e.printStackTrace();
			}
			times++;
			
			
			if(bloquerE(this,ets,this.getDirect()))
			{
				switch(this.getDirect())
				{
				case 0:
					//cvd le char avance vers le haut
					if(this.getY()>10)
					{
						
						y -=speed;
						break;
					}else
					{
						this.setY(9);
						this.setDirect((int) (Math.random()*4));
					}
				case 1:
					if(this.getY()+15<375)
					{
						y +=speed;
					    break;
					}else{
						this.setY(360);
						this.setDirect((int) (Math.random()*4));
					}
				case 2:
					if(this.getX()>10)
					{
						x -=speed;
						break;
					}else{
						this.setX(9);
						this.setDirect((int) (Math.random()*4));
					}
				case 3:
					if(this.getX()+10<=590)
					{
						
						x +=speed;
						break;
					}else
					{
						this.setX(584);
						this.setDirect((int) (Math.random()*4));
					}
				}
			}else{
				this.setDirect((int) (Math.random()*4));
			}
			
			
			//chaque 5s,le char change la direction et la vitesse de tir au hasard
			if(times%40==0)
			{
				this.setDirect((int) (Math.random()*4));
				setSp((int) (Math.random()*10)+20);
			}
			if(times%sp==0)
			{
				if(this.mm.size()<10){
					tirer();
				}
				
			}
			
			//verifie si ce char est mort
			if(this.isAlive()==false)
			{
				//on sort du thread quand ce char est mort
				break;
			}
			
		}
		
	}

	public int getSp() {
		return sp;
	}

	public void setSp(int sp) {
		this.sp = sp;
	}
	
	
	//verifie si ce char touche les autres chars
	
	public boolean bloquerE(EnemyTank e,Vector<Tank> ets,int direct)
	{
		//on verifie avec les autres chars ennemi et le char hero
		
		
		boolean res =true;
		    switch(direct)
		    {
		    case 0:
		    	for(int i=0;i<ets.size();i++)
		    	{
		    		
		    		Tank et = ets.get(i);
		    		if(et!=this)
		    		{
			    		if(Math.abs(e.getX()-et.getX())<20&&Math.abs(e.getY()-e.getSpeed()-et.getY())<20)
			    		{ 
			    			res = false;
			    			e.setY(et.getY()+20);//on touche le bord sud du char ennemi
			    		}
		    		}
		    	}
		    	break;
		    case 1:
		    	for(int i=0;i<ets.size();i++)
		    	{
		    		Tank et = ets.get(i);
		    		if(et!=this)
		    		{
			    		if(Math.abs(e.getX()-et.getX())<20&&Math.abs(e.getY()+e.getSpeed()-et.getY())<20  )
			    		{ 
			    			res = false;
			    			e.setY(et.getY()-20);////on touche le bord nord du char ennemi
			    		}
		    		}
		    	}
		    	break;
		    case 2:
		    	for(int i=0;i<ets.size();i++)
		    	{
		    		Tank et = ets.get(i);
		    		if(et!=this)
		    		{
			    		if(Math.abs(e.getX()-e.getSpeed()-et.getX())<20&&Math.abs(e.getY()-et.getY())<20  )                                  
			    				
			    		{
			    			res=false;
			    			e.setX(et.getX()+20);//on touche le bord est du char ennemi
			    		}
		    		}
		    	}
		    	break;
		    case 3:
		    	for(int i=0;i<ets.size();i++)
		    	{
		    		Tank et = ets.get(i);
		    		if(et!=this)
		    		{
			    		if(Math.abs(e.getX()+e.getSpeed()-et.getX())<20&&Math.abs(e.getY()-et.getY())<20)
			    		{ 
			    			res = false;
			    			e.setX(et.getX()-20);//on touche le bord ouest du char ennemi
			    		}
		    		}
		    	}
		    	break;
		    }
		
		return res;
	}
}
	




